package edu.uca.info2;

import java.util.Iterator;
import java.util.List;

import edu.uca.info2.components.Gold;
import edu.uca.info2.components.Pit;
import edu.uca.info2.components.Problem;

public class Board {
	
	public Board(){
		
		for (int i = 0; i< 4 ; i++){
			for (int j = 0; j< 4 ; j++){
				this.squares[i][j] = new Square();
			}
		}
	}
	
	public boolean state = false; // no resuelto
	public boolean goldCatched = false; //oro agarrado o no.
	public Square [][] squares = new Square[4][4];
	int a = 1;
	
	public void fillBoardFromProblemObjetc(Problem problem){
		
		squares[problem.getGold().getRow()-1][problem.getGold().getCol()-1].setGold(true);// se setea posicion del oro
		squares[problem.getWumpus().getRow()-1][problem.getWumpus().getCol()-1].setWumpus(true); // se setea posicion del wumpus
		squares[problem.getGold().getRow()-1][problem.getGold().getCol()-1].setShine(true);// se setea brillo en la misma posicion del oro
		squares[3][3].setAgent(true);// El agente arranca del angulo inferior derecho.
		
		// seteamos hedor en las adyacentes al wumpus
		// controlar que no este en el limite. Aca la matriz empieza de 0 y en el archivo de 1.
		if (problem.getWumpus().getRow() < 4) // se quiere AUMENTAR la fila, entonces no se le resta -1 a la fila (significa que esta sumando una fila)
			squares[problem.getWumpus().getRow()][problem.getWumpus().getCol()-1].setStench(true); 
		if (problem.getWumpus().getCol() < 4) // se quiere AUMENTAR la columna, entonces no se le resta -1 a la columna (significa que esta sumando una columna)
			squares[problem.getWumpus().getRow()-1][problem.getWumpus().getCol()].setStench(true); 
		if (problem.getWumpus().getRow() > 1) // se quiere DISMINUIR la fila, entonces se tiene que restar 2.
			squares[problem.getWumpus().getRow()-2][problem.getWumpus().getCol()-1].setStench(true); 
		if (problem.getWumpus().getCol() > 1) // se quiere DISMINUIR la fila, entonces se tiene que restar 2.
			squares[problem.getWumpus().getRow()-1][problem.getWumpus().getCol()-2].setStench(true); 		
		
		
		// aqui seteamos los abismos y los vientos en los adyacentes a los abismos.
		List<Pit> pits = problem.getPits();
		Iterator<Pit> pitsIterator = pits.iterator();
		
		
		while (pitsIterator.hasNext()){
			Pit pit = pitsIterator.next();
			squares[pit.getRow()-1][pit.getCol()-1].setPit(true);
			//viento en las adyacentes
			if (pit.getRow() < 4) // se quiere AUMENTAR la fila, entonces no se le resta -1 a la fila (significa que esta sumando una fila)
				squares[pit.getRow()][pit.getCol()-1].setWind(true); 
			if (pit.getCol() < 4) // se quiere AUMENTAR la columna, entonces no se le resta -1 a la columna (significa que esta sumando una columna)
				squares[pit.getRow()-1][pit.getCol()].setWind(true); 
			if (pit.getRow() > 1) // se quiere DISMINUIR la fila, entonces se tiene que restar 2.
				squares[pit.getRow()-2][pit.getCol()-1].setWind(true); 
			if (pit.getCol() > 1) // se quiere DISMINUIR la fila, entonces se tiene que restar 2.
				squares[pit.getRow()-1][pit.getCol()-2].setWind(true); 		
			
		}
		
	}
	
	public void printBoard() {
		
		for (int i = 0; i< 4 ; i++){
			for (int j = 0; j< 4 ; j++){
				System.out.print("{");
				//si hay wumpus imprimimos W si no, nada
				if (squares[i][j].isWumpus())
					System.out.print("<W>");
				//si hay oro imprimimos G si no, nada
				if (squares[i][j].isGold())
					System.out.print("<G>");
				//si hay agente imprimimos A si no, nada
				if (squares[i][j].isAgent())
					System.out.print("<A>");
				//si hay brillo imprimimos S si no, nada
				if (squares[i][j].isShine())
					System.out.print("<S>");
				//si hay viento imprimimos wi si no, nada
				if (squares[i][j].isWind())
					System.out.print("<wi>");
				//si hay hedor imprimimos st si no, nada
				if (squares[i][j].isStench())
					System.out.print("<st>");
				//si hay abismo imprimimos pit si no, nada
				if (squares[i][j].isPit())
					System.out.print("<pit>");
				//si hay grito imprimimos sc si no, nada
				if (squares[i][j].isScream())
					System.out.print("<sc>");
			
				System.out.print("} , ");
			}
			System.out.println("\n");
		}
	}

}
